package com.diver.flinkdemo.entity;/**
 * @author yangs
 */

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.diver.flinkdemo.utils.DateUtil;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.util.Date;

/**
 * @author yangs
 */
@Slf4j
@Getter
@Setter
@ToString
public class DalData {

    //XSZ_UP_MSG
    private String uploadData;
    //通话时长
    private String callTime;
    private String iccid;
    //定位频率
    private String locateReportRate;
    //信号强度
    private String signalStrength;
    //通话记录号码
    private String callNum;
    //通话开始时间
    private String callStart;
    //通话记录类型
    private Integer callType;
    //gsm信号强度
    private String gsmSignalStrength;
    //卫星个数
    private String satelliteSize;
    //对应下发消息UID
    private String smsUid;
    //消息状态 0=已读；1=其他
    private String status;

    //命令码
    private String typeIdent;
    //设备型号
    private String deviceModel;
    //电量
    private String power;
    //注网状态
    private String netStatus;
    //步数
    private String steps;
    //PARSED_LOCATION
    //	其他基站
    private String jzStrNear;
    //浮点数，定位精度，可选（GPS存在）
    private String pdop;
    //定位上传类型：WIFI，BASE, GPS
    private String uploadType;
    private String imei;
    //设备上传时间，格式yyyy-MM-dd HH:mm:ss
    private String stamp;
    //	消息唯一ID
    private String msgId;
    //    mac地址
    private String mac;
    //浮点数，经度
    private String latitude;
    //	浮点数，维度
    private String longitude;
    //基站第一位
    private String jzStr;
    //	产品Id
    private String appId;
    //
    private String type;

    private String tag;
    //关机原因(2=手动关机；5=长按 6s 自动重启)
    private String offCause;

    private Date uploadTime;

    //c40DataVo
    /**
     * 下发唯一指令 16进制（传返回，没传为null）
     */
    private String taskId;
    /**
     * sos 0=非SOS通话，1=SOS通话
     */
    private Integer callSos;
    /**
     * 发送手机号
     */
    private String otherCallNum;
    /**
     * 短信内容
     */
    private String shortMsg;
    /**
     * 发送时间
     */
    private String receivedTime;
    /**
     * c40软件设备号
     */
    private String softwareVersion;
    /**
     * 硬件设备号
     */
    private String hardwareVersion;
    /**
     * 附近的wifi
     */
    private String wifiInfos;
    /**
     * 通话记录推送
     * 0=不是白名单，不是免打扰模式
     * 1=是白名单，不是免打扰模式
     * 2=不是白名单，是免打扰模式
     * 3=是白名单，是免打扰模式
     */
    private Integer callFlg;


    public static DalData convert(String jsonStr) throws InvocationTargetException, IllegalAccessException, ParseException {
        //jo:第一层数据；jsonObject：第二层数据；dalData：第三层数据
        JSONObject jo = JSON.parseObject(jsonStr);
        DalData dalData = new DalData();
        BeanUtils.copyProperties(dalData,jo);
        JSONObject jsonObject = jo.getJSONObject("data");
        BeanUtils.copyProperties(dalData,jsonObject);
        dalData.setTypeIdent(jsonObject.getString("commandKey"));
        if ("XSZ_UP_MSG".equals(jo.getString("type"))) {
            String msgId = jsonObject.getString("msgId");
            String uploadTimeStr = msgId.substring(4);
            long uploadTime = Long.parseLong(uploadTimeStr);
            dalData.setUploadTime(new Date(uploadTime));
            dalData.setUploadData(jsonObject.toJSONString());
            dalData.setImei(jsonObject.getString("deviceId"));
            JSONObject reportData = jsonObject.getJSONObject("reportData");
            BeanUtils.copyProperties(dalData,reportData);
            if ("CALLRECORD".equals(dalData.getTypeIdent())) {
            }else if ("UD".equals(dalData.getTypeIdent()) || "AL".equals(dalData.getTypeIdent())) {
                //设备上报的原始UD和AL数据不需要做后续的逻辑处理
                dalData.setTypeIdent("");
            }
        }else if ("PARSED_LOCATION".equals(jo.getString("type"))){
            String stamp = jsonObject.getString("stamp");
            Date timeStamp = DateUtil.parseDate(stamp,"yyyy-MM-dd HH:mm:ss");
            dalData.setUploadTime(timeStamp);
            JSONObject locTo = jsonObject.getJSONObject("locTo");
            BeanUtils.copyProperties(dalData,locTo);
            JSONObject std = jsonObject.getJSONObject("std");
            BeanUtils.copyProperties(dalData,std);
            if ("UD".equals(dalData.getTypeIdent()) || "AL".equals(dalData.getTypeIdent())) {
                if ("AL".equals(dalData.getTypeIdent())) {
                    //AL 16进制类型
                    String devStatus = std.getString("devStatus");
                    if ("00010000".equals(devStatus)) {
                        dalData.setTypeIdent("AL");
                    } else if ("00020000".equals(devStatus)) {
                        dalData.setTypeIdent("AL_BATTERY");
                    }
                }
            }
        }else if ("TASK_TRACKING".equals(jo.getString("type"))) {
            JSONObject secData = jsonObject.getJSONObject("data");
            dalData.setStatus(jsonObject.getString("status"));
            if (secData!=null) {
                dalData.setImei(secData.getString("nodeId"));
                dalData.setTypeIdent(secData.getString("commandKey"));
                JSONObject smsMsgBodyParams = secData.getJSONObject("smsMsgBodyParams");
                if (smsMsgBodyParams != null) {
                    dalData.setSmsUid(smsMsgBodyParams.getString("smsUid"));
                }
            }
        }
        log.info("convertData,{}",dalData);
        return dalData;
    }
}
